# 车辆检测系统的界面设计。用tkinter原生库设计
from tkinter import *
from tkinter import messagebox  # 导入弹出消息框模块
import cv2
import datetime
from PIL import Image, ImageTk
import sys
img_path = "D:\\"  # 图像保存的根目录路径，测试一律D盘，防止打包后在别地机子上找不到路径
# "D:\\Develop\\pyproject\\IPCamer\\config\\"


def video_loop():  # 显示视频在幕布上
    ret, frame = cap.read()
    if ret:
        # cv2.imshow('车辆检测', frame)
        key = cv2.waitKey(10)  # 如果不加这一句，图像将一闪而过
        cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)  # 转换颜色从BGR到RGBA
        current_image = Image.fromarray(cv2image)  # 将图像转换成Image对象
        imgtk = ImageTk.PhotoImage(image=current_image)
        panel.imgtk1 = imgtk
        panel.config(image=imgtk)

        root.after(1, video_loop)


def photograph():  # 拍照并保存功能，如果保存成功，弹出消息框，先实现简单的第一步，后续逐渐添加
    # 测试摄像头是否打开
    if not cap.isOpened():
        print("Error opening Video File.")
    else:
        print("成功 opening Video File.")

    ret, frame = cap.read()
    now_time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")  # 现在的精确时间，准备将时间戳加到保存文件名中
    result = cv2.imwrite(img_path + now_time + "car.jpg", frame)  # 保存图片，
    if result:
        a = messagebox.showinfo('恭喜', '保存成功!')  # 弹出消息提示框  showinfo
        print(a)
    else:
        a = messagebox.showerror('警告', '保存失败')  # 弹出消息提示框
        print(a)

    
def my_exit():  # 关闭摄像头，释放所有窗口
    cap.release()
    cv2.destroyAllWindows()
    sys.exit()


if __name__ == '__main__':
    # 打开摄像头
    # cv2.namedWindow('车辆检测', 1)  # 窗口起名
    """
    开启摄像头,可能的两个摄像头ip地址 
    http://10.131.26.67:8081/video
    http://6cwhvdbsblpcm.local:8081/video    
    """
    video = "http://admin:admin@10.131.26.67:8081/video"
    cap = cv2.VideoCapture(video)  # 获取视频内容

    # 设计界面并并绑定按键事件
    root = Tk()
    root.title("车辆检测")
    # root.geometry("1280x750")
    panel = Label(root)  # initialize image panel
    panel.pack(padx=10, pady=10, )
    # panel.geometry("600x400")

    # button 监听按键事件，注册回调拍照保存 退出窗口等功能，按说界面设计和功能代码混合在一起是最烂的写法，省时间无所谓了
    btn1 = Button(root, font=('楷体', 26), text="拍照并保存", bg='DodgerBlue', fg='white', width=10, height=1,
                  command=photograph)  # 不小心给回调函数加了括号，导致只能执行一次
    btn1.pack(anchor=SW, side="left", fill="none", padx=15, pady=5)

    btn2 = Button(root, font=('楷体', 26), text="关闭摄像头", bg='DodgerBlue', fg='white', width=10, height=1, command=my_exit)
    btn2.pack(anchor=SE, side="right", fill="none", padx=15, pady=5)

    video_loop()  # 主功能函数，递归循环不停的播放视频
    root.mainloop()

    print("2+3=", 2 + 3)  # 结束标志

    # 当一切都完成后，关闭摄像头并释放所占资源
    cap.release()
    cv2.destroyAllWindows()
